// pages/login/login.js
Page({
  data: {
    phone_show: false,
    phone_value: '',
    openid: '',
    isCounting: false, // 判断是否正在发送验证码
    countdownTime: 60, // 倒计时秒数
    timer: null, // 计时器
    code_num: '',
    code_num_input: '',
    code_expiry: 0,      // 过期时间戳
    countdown: 0,         // 剩余秒数--过期时间
    expiryTimer:null  // 计时器--过期时间
  },
  // 获取用户信息并登录
  onGetUserInfo(e) {
    wx.showLoading({
      title: '登录中',
    })
    if (e.detail.userInfo) {
      wx.login({
        success: (loginRes) => {
          wx.cloud.callFunction({
            name: 'login',
            data: {
              code: loginRes.code,
              userInfo: e.detail.userInfo
            },
            success: (res) => {
              // console.log('云函数返回:', res,res.result.code);
              console.log('云函数返回:', res, res.result.data.openid, '是否登录', res.result.data.isLogin);
              // 1. 判断是否登录成功
              if (res.result.data.openid) {
                // 2. 判断是否已经等路过了
                if (res.result.data.isLogin) {
                  const db = wx.cloud.database()
                  // 这里已经登录过了
                  // 通过openid获取user_id
                  db.collection('users').where({
                      _openid: res.result.data.openid
                    })
                    .get()
                    .then((res) => {
                      console.log('获取成功：', res.data)
                      const user_id = res.data[0]._id;
                      wx.setStorageSync('user_id', user_id);
                      wx.hideLoading()
                    })
                    .catch((err) => {
                      console.log('获取失败：', err)
                    })
                  wx.showToast({
                    title: '您已注册,登录成功',
                  });
                  wx.navigateBack({
                    delta: 1 // 返回层数，默认1
                  })
                  wx.setStorageSync('openid', res.result.data.openid);
                } else {
                  // 这里的是之前未注册的需要去绑定手机号
                  wx.showToast({
                    title: '登录成功,请绑定手机号',
                  });
                  wx.hideLoading()
                  const openid = res.result.data.openid;
                  // 绑定手机号的弹框
                  this.setData({
                    phone_show: true,
                    openid
                  })
                }
              } else {
                wx.showToast({
                  title: '登录失败: 无id',
                  icon: 'error'
                });
              }
            },
            fail: (err) => {
              console.error('云函数调用失败:', err);
            }
          });
        }
      });
    }
  },
  // 电话对话框的确定
  enter() {
    const db = wx.cloud.database();
    const {
      openid,
      phone_value,
      code_num,
      code_num_input
    } = this.data;
    // 手机号格式验证
    if (!this.validatePhone(phone_value)) {
      return this.showError('手机号格式不正确');
    }
    // 检查验证码是否过期
    if (this.data.countdown <= 0) {
      return this.showError('验证码已过期');
    }
    // 检查验证码是否正确
    if (code_num_input !== code_num.toString()) {
      return this.showError('验证码不正确');
    }

    // 这里需要判断一下手机号是否为11位数
    // 根据 openid 查询并更新记录
    db.collection('users')
      .where({
        _openid: openid
      })
      .get()
      .then(res => {
        if (res.data.length === 0) {
          // 如果登录没问题这里就会通过
          console.log('未找到符合条件的记录');
          wx.showToast({
            title: '用户不存在',
            icon: 'error'
          });
          return;
        }
        // 获取第一条记录的 _id
        const docId = res.data[0]._id;
        wx.setStorageSync('user_id', docId);
        // 更新该记录
        console.log(res, openid, phone_value)
        return db.collection('users').doc(docId).update({
          data: {
            phone: phone_value // 设置新字段和值
          }
        });
      })
      // 执行更新操作
      .then(updateRes => {
        console.log('更新成功', updateRes);
        this.setData({
          phone_show: false
        });
        wx.setStorageSync('openid', this.data.openid);
        wx.navigateBack({
          delta: 1 // 返回层数，默认1
        })
        wx.showToast({
          title: '绑定成功',
          icon: "success"
        });
      })
      .catch(err => {
        console.error('更新失败', err);
        wx.showToast({
          title: '绑定失败',
          icon: 'error'
        });
      });
  },
  // 电话号码的输入框input事件
  Oninput(e) {
    console.log(e)
    const phone_value = e.detail.value;
    this.setData({
      phone_value
    })
  },
  // 验证码的输入框input事件
  Oninput_code(e) {
    const code_num_input = e.detail.value;
    this.setData({
      code_num_input
    })
  },
  // 电话对话框的取消
  cancel() {
    wx.showToast({
      title: '未绑定手机号，登录失败',
      icon: "error"
    })
    wx.navigateBack({
      delta: 1 // 返回层数，默认1
    })
    this.setData({
      phone_show: false
    })
  },
  // 验证手机号格式
  validatePhone(phone) {
    const reg = /^(?:\+?86[\-\s]?)?1(?:3\d{3}|4[5-9]\d{2}|5[0-35-9]\d{2}|6[2567]\d{2}|7[0-8]\d{2}|8\d{3}|9[189]\d{2})\d{6}$/;
    // const reg = /^(?:(?:\+|00)86)?1[3-9]\d{9}$/;
    if (!reg.test(phone)) {
      wx.showToast({
        title: '请输入有效的手机号',
        icon: 'error'
      });
      return false;
    }
    return true;
  },
  // 错误处理统一封装
  showError(msg) {
    wx.showToast({
      title: msg,
      icon: 'none',
      duration: 2500
    });
  },
  // 登录时候获取验证码
  // 发送验证码
  get_code() {
    const {
      phone_value
    } = this.data;

    // 验证手机号
    if (!this.validatePhone(phone_value)) {
      return this.showError('请输入正确手机号');
    }

    // 生成验证码
    const code = Math.floor(Math.random() * 900000) + 100000;
    const expiryTime = 5 * 60; // 5分钟有效期（单位：秒）--验证码有效期

    this.setData({
      code_num: code,
      // 当前时间戳（秒） + 有效期（秒） = 过期时间戳（秒）。
      code_expiry: Math.floor(Date.now() / 1000) + expiryTime,
      countdown: expiryTime
    });

    // 启动双倒计时
    this.startCountdown(); // 按钮禁用倒计时
    this.startExpiryTimer(); // 验证码有效期倒计时

    // 发送请求
    wx.request({
      url: 'http://dfsns.market.alicloudapi.com/data/send_sms',
      method: "POST",
      data: {
        phone_number: phone_value,
        content: `code:${code}`,
        template_id: "CST_ptdie100"
      },
      header: {
        Authorization: "APPCODE c66d57cf76ae4a31b0a0a81acde677f1",
        "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"
      },
      success: (res) => {
        if (res.statusCode !== 200) {
          this.clearTimers();
        }
      }
    })
  },
  // 倒计时逻辑
  startCountdown() {
    this.setData({
      isCounting: true,
      countdownTime: 60
    });
    // 设置计时器setInterval
    const timer = setInterval(() => {
      // 这里进行判断如果即时到 1 时候清除计时器
      if (this.data.countdownTime <= 1) {
        clearInterval(timer);
        this.setData({
          isCounting: false,
          countdownTime: 60
        });
        return;
      }
      this.setData({
        countdownTime: this.data.countdownTime - 1
      });
    }, 1000);

    this.setData({
      timer
    });
  },
  // 验证码有效期倒计时
  startExpiryTimer() {
    const expiryTimer = setInterval(() => {
      // 用过期时间戳一直去减 当前时间戳（一直在增长）----remaining的值会越来越小直至为0
      const remaining = this.data.code_expiry - Math.floor(Date.now() / 1000);
      if (remaining <= 0) {
        clearInterval(expiryTimer);
        this.setData({
          code_num: null,
          countdown: 0
        });
        return;
      }
      this.setData({
        countdown: remaining
      });
    }, 1000);
    this.setData({
      expiryTimer
    });
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {
    wx.setNavigationBarTitle({
      title: '登录',
    })
  },
  onReady() {},
  onUnload() {
    clearInterval(this.data.timer);
    clearInterval(this.data.expiryTimer);
  }
})